package org.telegram.bot.service.impl;

import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.ruoyi.common.enums.StatusEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.spring.SpringUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.telegram.bot.exception.BotApiException;
import org.telegram.bot.base.BotRegisterApplication;
import org.telegram.bot.domain.BotInfo;
import org.telegram.bot.domain.BotKeyboard;
import org.telegram.bot.handle.IBotSendMessage;
import org.telegram.bot.mapper.BotInfoMapper;
import org.telegram.bot.service.IBotInfoService;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 机器人信息Service业务层处理
 *
 * @author wyx
 * @date 2023-05-29
 */
@Slf4j
@Service
public class BotInfoServiceImpl implements IBotInfoService, IBotSendMessage
{
    @Resource
    private BotInfoMapper botInfoMapper;
    
    /**
     * 查询机器人信息
     *
     * @param id 机器人信息主键
     * @return 机器人信息
     */
    @Override
    public BotInfo selectBotInfoById(Long id)
    {
        return botInfoMapper.selectById(id);
    }

    /**
     * 查询机器人信息列表
     *
     * @param botInfo 机器人信息
     * @return 机器人信息
     */
    @Override
    public List<BotInfo> selectBotInfoList(BotInfo botInfo)
    {
        return botInfoMapper.selectBotInfoList(botInfo);
    }

    /**
     * 获取开启的机器人
     * @return
     */
    @Override
    public Map<String,BotInfo> selectList4Register()
    {
        Map<String,BotInfo> bots = new HashMap<>();
        BotInfo botInfo = new BotInfo();
        botInfo.setStatus(StatusEnum.OK.getCode());
        List<BotInfo> list = botInfoMapper.selectBotInfoList(botInfo);
        if(!CollectionUtils.isEmpty(list)){
            for (BotInfo bot : list) {
                bots.put(bot.getId(),bot);
            }
        }
        return bots;
    }

    /**
     * 新增机器人信息
     *
     * @param botInfo 机器人信息
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int insertBotInfo(BotInfo botInfo)
    {
        int i = 0;
        try {
            if(SqlHelper.retBool(botInfoMapper.selectCountByToken(botInfo.getToken()))){
                throw new ServiceException("已存在相同机器人");
            }
            i  = botInfoMapper.insert(botInfo);
            SpringUtils.getBean(BotRegisterApplication.class).registerBot(botInfo);
        } catch (TelegramApiException e) {
            throw new BotApiException(e);
        }
        return i ;
    }

    /**
     * 修改机器人信息
     *
     * @param botInfo 机器人信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateBotInfo(BotInfo botInfo) {
        try {
            SpringUtils.getBean(BotRegisterApplication.class).updateStatus(botInfo);
        } catch (TelegramApiException e) {
            throw new BotApiException(e);
        }
        return botInfoMapper.updateById(botInfo);
    }

    /**
     * 修改机器人信息
     *
     * @param botInfo 机器人信息
     * @return 结果
     */
    @Override
    public int updateBotStatus(BotInfo botInfo) {
        return botInfoMapper.updateById(botInfo);

    }

    /**
     * 批量删除机器人信息
     *
     * @param ids 需要删除的机器人信息主键
     * @return 结果
     */
    @Override
    public int deleteBotInfoByIds(Long[] ids)
    {
        return botInfoMapper.deleteByIds(Arrays.asList(ids));
    }

    /**
     * 删除机器人信息信息
     *
     * @param id 机器人信息主键
     * @return 结果
     */
    @Override
    public int deleteBotInfoById(Long id)
    {
        return botInfoMapper.deleteById(id);
    }
    
    /**
     * 发送消息测试
     * @param botKeyboard
     * @return
     */
    @Override
    public Boolean sendMessageTest(BotKeyboard botKeyboard){
        List<String> list = selectBotInfoList(new BotInfo()).stream().map(BotInfo::getId).toList();
        String onlineBotId = null;
        //查询在线的机器人
        for (String id : list) {
            BotInfo botInfo = getBotInfo(id);
            if(botInfo.getBot().getBotSession().isRunning()){
                onlineBotId = id;
                break;
            }
        }
        if(!StringUtils.hasText(onlineBotId)){
            throw new ServiceException("机器人状态异常，无法测试，请联系超级管理员");
        }
        sendAsync(onlineBotId,SendMessage.builder()
                .chatId(botKeyboard.getChatId())
                .text(botKeyboard.getContent())
                .replyMarkup(botKeyboard.getInlineKeyboardMarkup())
                .build());
        return true;
    }
}
